Merhaba arkadaşlar mobilhanem.com için hazırladığımız Php derslerimizde bu ders Regular Expression (regex) konusuna bakacağız. Regex string ifadeler ile işlem yapmamızı sağlayan başlı başına bir sorgu dili diyebiliriz. Regex sadece php de değil diğer programlama dillerinde de kullanılır. Kod yorumlayıcılarınında alt yapısını regex oluşturur. Regexi ne kadar iyi bilirseniz o kadar iyi iş yapabilirsiniz. Regex php de ise genellikle bot yapımında ve string manipule etmede kullanılır.
Regular Expression
Regex dediğimiz yapı metin içerisinde arama yapma, metine protokol uygulama, metin değiştirme veya bir metni yorumlamak amacıyla kullanılır. Örneğin web sitemizde bir üyelik formu olduğunu düşünelim. Buraya girilen e-posta adresinin e-posta kurallarına uyup uymadığını regex patterni ile kontrol edebiliriz. Aynı şekilde cep telefonu kontrolü yapmak veya link kontrolü yapmak gibi bir sürü yerde regex patterni kullanabiliriz.
Öncelikle regexin bilmemiz bazı kuralları var bu kurallardan başlayalım ve daha sonra örnekler yapalım.
Özel Karakterler
d | Herhangi bir rakamı ifade eder |
. | Satır başı hariç herhangi bir karakteri ifade eder |
w | Herhangi bir harfi, rakamı veya alt tireyi ifade eder |
s | Herhangi bir görünmez karakteri ve boşluğu ifade eder. (Boşluk, tab, satır başı gibi) |
^ | Başlangıcı ifade eder |
$ | Sonu ifade eder |
* | Kendinden önce yazılmış karakterin; sıfır veya daha fazla tekrar etmesini ifade eder |
+ | Kendinden önce yazılmış karakterin; bir veya daha fazla tekrar etmesini ifade eder |
? | Kendinden önce yazılmış karakterin; olsa da olur olmasa da olurunu ifade eder |
{123} | Kendinden önce yazılmış karakterin; parantez içerisine yazılan sayı kadar tekrar etmesini ifade eder |
{1, 2} | Kendinden önce yazılmış karakterin; parantez içerisinde yazılan iki sayı arasında tekrar etmesini ifade eder |
( … ) | Parantez içerisine yazılan ifadeleri gruplamaya yarar |
( … | … ) | Parantez içerisine yazılan “|” dik tire işareti ya da anlamına gelir, içerisine yazılan ve dik tire ile ayrılan ifadelerden herhangi birisinin eşleşmesini ifade eder |
[ … ] | Köşeli parantez içerisine yazılan karakterlerden bir tanesini ifade eder |
\ | Kaçış karakteri. Yukarıda yazdığımız karakterleri normal olarak yazmak istediğimizde başına kaçış işaretini koyarız. Örneğin noktayı ifade etmek için . |
D | Rakam olmayan herhangi bir karakteri ifade eder |
S | Görünmez ve boşluk olmayan karakteri ifade eder |
W | Harf, rakam veya alt tire olmayan karakteri ifade eder |
b | Kelimenin başını veya sonunu ifade eder |
[^ … ] | Üç nokta yerine yazılan karakterler haricindeki karakterleri ifade eder. örn: [^abc] abc karakterleri dışındaki herşey. |
[a-z] | A dan z’ye olan harflerden birisini ifade eder. |
preg_match() & preg_match_all() Fonksiyonu
Php de regex ile işlem yaparken preg_match veya preg_match_all fonksiyonlarından birini kullanırız. Bu fonksiyonların birbirinden farkı preg_match bir kere işlem yaparken preg_match_all metnin sonuna kadar regex patternini çalıştırır.
preg_match($pattern,$metin,$dizi) birinci parametre regex patterni, ikinci parametre metin üçüncü parametre ise regexte yakaladığı kısımları da atar. Regexin çalışma durumuna göre geriye true veya false olarak değer döndürür.
preg_match_all($pattern,$metin,$dizi) fonksiyonunun parametreleri de preg_match ile aynıdır.
Şimdi örneklerimize Geçelim.
- Metin içerisinde kelime arama:
<?php $pattern= "/mobilhanem/"; $metin = "Merhaba mobilhanem.com Php Dersleri"; if(preg_match($pattern,$metin)) echo "mobilhanem kelimesi mevcut."; else echo "mobilhanem kelimesi mevcut değil."; ?>
mobilhanem kelimesi var ise bize true değeri döndürmesi gerekiyor. kodu çalıştırdığınızda ekranda mobilhanem kelimesi mevcut yazacaktır.
- metin içerisinde rakam var mı kontrolü yapmak.
$pattern = "/[0-9]+/"; $metin = "Mobilhanem 3 yaşında"; if(preg_match($pattern,$metin)) echo "Metin içerisinde en az bir rakam var."; else echo "metin içerisinde rakam yok.";
- Tarih formatı kontrol etmek.
<?php $pattern = '/[0-9]{2}\.[0-9]{2}\.[0-9]{4}/'; $metin = "01.01.1995"; if(preg_match($pattern,$metin)) echo "Geçerli Tarih Formatı"; else echo "Tarih Formatı Geçersiz.."; ?>
Regex patternimizi açıklayacak olursak:
- [0-9]{2} iki tane yan yana rakam olsun dedik.
- \. nokta(.) regexe ait bir karakter olduğu için kaçış karakteri kullanarak noktayı regex olarak algılamayıp nokta işareti olarak arama yapmasını sağladık.
- Regex ile E-mail kontrolü yapmak.
<?php $pattern= '/^[a-z]+[A-z0-9\-_\.]+@[A-z0-9\-]+\.[A-z0-9\-]+/'; $metin = "[email protected]"; if(preg_match($pattern,$metin)) echo "Geçerli E-Mail Formatı"; else echo "E-mail Geçersiz.."; ?>
Regex Patterni ile yakaladığımız veriyi göstermek
Elimizde bir menü xml olduğunu varsayalım. bu xml içerisindeki itemleri nasıl alabileceğimizi preg_match ve preg_match_all ile görelim.
<?php $pattern= '/<menu>(.*?)<\/menu>/si'; $metin = " <menu>item1</menu> <menu>item2</menu> <menu>item3</menu> <menu>item4</menu> <menu>item5</menu> "; preg_match($pattern,$metin,$dizi); echo "preg_match ile alınan dizi içeriği:<br/>"; var_dump($dizi); echo "---------------------------<br/>"; preg_match_all($regex,$metin,$dizi); echo "preg_match_all ile alınan dizi içeriği:<br/>"; var_dump($dizi); ?>
Ekran Çıktısı:
Ekran çıktısına bakacak olursak: preg_match() sadece ilk elemanı aldıktan sonra dururken preg_match_all() metin bitinceye kadar çalışıp tüm itemleri almaktadır.
İster regex patterninin tamamını istersekte sadece aradığımız kısmı alabilmemiz için diziye ikiside atılmıştır.
Php ile regex kullanımı dersimizin sonuna geldik arkadaşlar. Bir sonraki dersimizde görüşmek üzere 🙂
Regular Expression konusu ile ilgili yorumlarınızı konu altından yapabilirsiniz, ayrıca sorularınızı yine konu altından ve Mobilhanem Soru&Cevap bölümünden sorabilirsiniz.
Tüm php dersleri için tıklayınız.
38
[…] çıkarabilirsiniz ? Bot yapmayı daha iyi anlayabilmeniz için bir önceki dersimiz olan Php Dersleri – Regular Expression dersimizi incelemenizi […]
Çok güzel ve açıklayıcı, bilgilendirici bir yazı olmuş hocam teşekkürler
Şimdiye kadar karşılaştığım en iyi anlatım tebrik ederim.